package main

import "fmt"

/**
给你单链表的头节点 head ，请你反转链表，并返回反转后的链表。
 

示例 1：


输入：head = [1,2,3,4,5]
输出：[5,4,3,2,1]

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/reverse-linked-list
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */

type ListNode struct {
	Val int
	Next *ListNode
}

func main()  {
	head:=ListNode{
		Val:  1,
		Next: &ListNode{
			Val:  2,
			Next: &ListNode{
				Val:  3,
				Next: nil,
			},
		},
	}

	fmt.Println(fmt.Sprintf("%+v",reverseList(&head)))
}

func reverseList(head *ListNode) *ListNode {
	newHead:=ListNode{}
	for head!=nil{
		node := &ListNode{Val:head.Val}
		if newHead.Next==nil{
			newHead.Next = node
		}else{
			cur:=newHead.Next
			node.Next = cur
			newHead.Next=node
		}
		fmt.Println(fmt.Sprintf("->%+v",newHead.Next))
		fmt.Println(fmt.Sprintf("=>%+v",head))
		head =head.Next
	}

	return newHead.Next
}

func reverseList2(head *ListNode) *ListNode {
	newHead:=ListNode{}
	for head!=nil{
		cur:=newHead.Next
		node := &ListNode{Val:head.Val,Next:cur}
		newHead.Next=node

		head =head.Next
	}

	return newHead.Next
}